﻿#pragma once

#include<stdio.h>
#include<stdlib.h>
#include<locale.h>
#include<windows.h>
#include<stdbool.h>
#include<time.h>

#define WALL L'□'
#define FOOD L'※'
#define BODY L'●'

#define START_X 24
#define START_Y 10

#define KEYPRESS(vk) ((GetAsyncKeyState(vk) & 1) ? 1 : 0)


//蛇的结点
typedef struct SnakeNode
{
	int x;
	int y;
	struct SnakeNode* next;
}SnakeNode, * pSnakeNode;

enum GAMESTATUS
{
	NORMAL = 1,
	KILL_WALL,
	KILL_SELF,
	ESC
};

enum DIRECTION
{
	UP = 1,
	DOWN,
	LEFT,
	RIGHT
};

//贪吃蛇的结构
typedef struct Snake
{
	pSnakeNode _SnakeHead;//蛇头
	pSnakeNode _Food;//食物
	enum GAMESTATUS _Status;//游戏的状态：正常，撞墙退出，吃到自己退出，Ecs退出
	enum DIRECTION _Dir;//蛇头的朝向，默认为朝向右
	int _Score;//当前游戏分数
	int _Add;//吃一个食物增加的分数
	int _SleepTime;//睡眠时间，时间越短，移动速度越快
}Snake, * pSnake;

//游戏开始
void GameStart(pSnake ps);

//初始化蛇
void SnakeInit(pSnake ps);

//游戏运行
void GameRun(pSnake ps);

//打印帮助信息
void PrintHelpInfo();

//游戏暂停
void Pause();

//蛇的移动
void SnakeMove(pSnake ps);

//吃掉食物
void EatFood(pSnake ps, pSnakeNode pNext);

//不吃食物
void NotEatFood(pSnake ps, pSnakeNode pNext);

//撞到墙死掉
void KillByWall(pSnake ps);

//撞到自身死掉
void KillBySelf(pSnake ps);

//游戏的善后工作
void GameEnd(pSnake ps);
